from fastapi import APIRouter
from typing import Optional
import logging
import uuid

from ..models.base import (
    BaseResponse, ErrorResponse, Question, GradingResult,
    GradingResponse, StatelessGradingRequest
)
from ..services.grading_service import grading_service

logger = logging.getLogger(__name__)

router = APIRouter(prefix="/api/grading", tags=["grading"])
























@router.post("/grade/stateless", response_model=GradingResponse, summary="无状态评分")
async def grade_stateless(request: StatelessGradingRequest):
    """
    无状态评分接口 - 不依赖数据库存储

    所有评分所需信息通过请求体传入，支持以下字段：
    - question_title: 题目标题 (必填)
    - question_content: 题目内容 (必填)
    - student_answer: 学生答案 (必填)
    - question_type: 题目类型 (默认: essay)
    - subject: 学科 (默认: 通用)
    - max_points: 满分 (默认: 100)
    - difficulty: 难度 (默认: medium)
    - grading_criteria: 评分标准 (可选，不传则使用大模型知识库)
    - student_id: 学生ID (可选)
    - student_name: 学生姓名 (可选)
    - detailed_feedback: 是否详细反馈 (默认: True)
    """
    try:
        # 构建临时题目对象，不保存到数据库
        temp_question = Question(
            id=f"temp_{uuid.uuid4()}",
            title=request.question_title,
            content=request.question_content,
            question_type=request.question_type,
            subject=request.subject,
            difficulty=request.difficulty,
            points=request.max_points,
            tags=[]
        )

        # 直接使用AI引擎评分，不保存任何数据
        score, keyword_matches, feedback, strengths, weaknesses, suggestions = \
            await grading_service.ai_engine.grade_answer(
                temp_question,
                request.student_answer,
                request.grading_criteria
            )

        # 构建评分结果，不保存到数据库
        result = GradingResult(
            id=f"temp_{uuid.uuid4()}",
            answer_id=f"temp_{uuid.uuid4()}",
            question_id=temp_question.id,
            score=score,
            max_score=float(request.max_points),
            score_percentage=round((score / request.max_points) * 100, 2),
            keyword_matches=keyword_matches,
            strengths=strengths,
            weaknesses=weaknesses,
            suggestions=suggestions,
            detailed_scores={},
            feedback=feedback,
            confidence=0.8
        )

        logger.info(f"无状态评分完成: 得分 {score}/{request.max_points} ({result.score_percentage}%)")

        return GradingResponse(
            success=True,
            message="无状态评分完成",
            grading_result=result
        )

    except Exception as e:
        logger.error(f"无状态评分失败: {e}")
        return ErrorResponse(
            message="无状态评分失败",
            details={"error": str(e)}
        )


@router.get("/demo", response_model=GradingResponse, summary="无状态评分演示示例")
async def demo_stateless_grading():
    """提供一个完整的无状态评分演示示例"""
    try:
        # 演示数据
        demo_request = StatelessGradingRequest(
            question_title="数据结构：什么是二叉树？",
            question_content="请详细解释什么是二叉树，包括其定义、特点、以及常见的应用场景。请举例说明。",
            student_answer="""
二叉树是一种重要的数据结构，它的定义是每个节点最多有两个子节点，通常称为左子节点和右子节点。

二叉树的主要特点包括：
1. 每个节点最多有两个子树
2. 左子树和右子树是有序的，不能任意颠倒
3. 即使某个节点只有一个子树，也要区分左子树还是右子树

二叉树的常见应用场景：
1. 二叉搜索树：用于快速查找、插入和删除操作
2. 堆：实现优先队列
3. 表达式树：用于编译器中表示数学表达式

例如，一个简单的二叉搜索树可能是这样的：
      5
     / \
    3   7
   / \ / \
  2  4 6  8
            """,
            question_type="essay",
            subject="计算机科学",
            max_points=100,
            difficulty="medium",
            student_id="demo_student",
            student_name="演示学生",
            # 不传入grading_criteria，使用大模型知识库评分
            detailed_feedback=True
        )

        # 调用无状态评分接口
        result = await grade_stateless(demo_request)
        return result

    except Exception as e:
        logger.error(f"演示评分失败: {e}")
        return ErrorResponse(
            message="演示评分失败",
            details={"error": str(e)}
        )